#!/bin/bash

#############################################
# Claude Code自动化安装脚本
# 功能：
# 1. 安装Node.js LTS版本
# 2. 安装Claude Code CLI工具
# 3. 配置环境变量（ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN和ANTHROPIC_BASE_URL）
#
# 使用方法：
# 1. 交互式运行（推荐）：
#    bash -c "$(curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/install_claude.sh)"
#
# 2. 非交互式运行（通过curl管道）：
#    curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/install_claude.sh | sudo bash -s -- --apikey=your_key
#
# 3. 非交互式运行（下载后执行）：
#    bash install_claude.sh --apikey=your_key --yes
#
# 参数说明：
#   --apikey=<key>       设置 Anthropic API Key（必需）
#   --baseurl=<url>      设置 API Base URL（可选，默认：https://user-api-01.aiweber.com）
#   --yes, -y            自动确认所有提示，跳过交互
#   --skip-nodejs        跳过 Node.js 安装
#   --skip-claude        跳过 Claude Code 安装
#   --force              强制重新安装已存在的组件
#   --help, -h           显示帮助信息
#############################################

set -e  # 遇到错误立即退出

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 参数变量
API_KEY=""
AUTH_TOKEN=""
BASE_URL="https://user-api-01.aiweber.com"
AUTO_YES=false
SKIP_NODEJS=false
SKIP_CLAUDE=false
FORCE_INSTALL=false
NON_INTERACTIVE=false

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
Claude Code 自动化安装脚本

使用方法:
  bash install_claude.sh [选项]
  curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/install_claude.sh | sudo bash -s -- [选项]

选项:
  --apikey=<key>       设置 Anthropic API Key（非交互模式必需）
  --baseurl=<url>      设置 API Base URL（默认: https://user-api-01.aiweber.com）
  --yes, -y            自动确认所有提示，启用非交互模式
  --skip-nodejs        跳过 Node.js 安装
  --skip-claude        跳过 Claude Code 安装
  --force              强制重新安装已存在的组件
  --help, -h           显示此帮助信息

示例:
  # 交互式安装（推荐，无交互问题）
  bash -c "$(curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/install_claude.sh)"

  # 非交互式安装（通过curl）
  curl -fsSL https://gitee.com/xledoo/deploy-sshkey/raw/master/install_claude.sh | sudo bash -s -- --apikey=sk-xxx --yes

  # 非交互式安装（下载后执行）
  sudo bash install_claude.sh --apikey=sk-xxx --yes

  # 强制重新安装
  sudo bash install_claude.sh --apikey=sk-xxx --yes --force

  # 自定义 Base URL
  sudo bash install_claude.sh --apikey=sk-xxx --baseurl=https://api.example.com --yes

EOF
    exit 0
}

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            --apikey=*)
                API_KEY="${1#*=}"
                shift
                ;;
            --api-key=*)
                # 兼容旧参数名
                API_KEY="${1#*=}"
                shift
                ;;
            --baseurl=*)
                BASE_URL="${1#*=}"
                shift
                ;;
            --base-url=*)
                # 兼容旧参数名
                BASE_URL="${1#*=}"
                shift
                ;;
            --yes|-y)
                AUTO_YES=true
                NON_INTERACTIVE=true
                shift
                ;;
            --skip-nodejs)
                SKIP_NODEJS=true
                shift
                ;;
            --skip-claude)
                SKIP_CLAUDE=true
                shift
                ;;
            --force)
                FORCE_INSTALL=true
                shift
                ;;
            --help|-h)
                show_help
                ;;
            *)
                log_error "未知参数: $1"
                echo "使用 --help 查看帮助信息"
                exit 1
                ;;
        esac
    done

    # 检查非交互模式下是否提供了 API Key
    if [[ "$NON_INTERACTIVE" == true && -z "$API_KEY" ]]; then
        log_error "非交互模式下必须提供 --apikey 参数"
        echo "使用 --help 查看帮助信息"
        exit 1
    fi

    # 如果提供了 API_KEY，自动启用非交互模式
    if [[ -n "$API_KEY" ]]; then
        NON_INTERACTIVE=true
        AUTO_YES=true
    fi
}

# 检查是否以root权限运行
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本必须以root权限运行"
        log_info "请使用: sudo bash $0"
        exit 1
    fi
    log_info "Root权限检查通过"
}

# 检测操作系统
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        echo "$ID"
    elif [[ -f /etc/debian_version ]]; then
        echo "debian"
    else
        echo "unknown"
    fi
}

# 检查Node.js是否已安装
check_nodejs() {
    if command -v node &> /dev/null; then
        local node_version=$(node --version)
        log_info "Node.js已安装: $node_version"
        return 0
    else
        log_warn "Node.js未安装"
        return 1
    fi
}

# 安装Node.js
install_nodejs() {
    log_step "正在安装Node.js LTS版本..."

    local os_type=$(detect_os)

    case "$os_type" in
        ubuntu|debian)
            log_info "检测到Debian/Ubuntu系统"

            # 下载并执行NodeSource安装脚本
            log_info "添加NodeSource仓库..."
            curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -

            # 安装Node.js
            log_info "安装Node.js..."
            apt-get install -y nodejs
            ;;
        centos|rhel|fedora|almalinux|rocky)
            log_info "检测到RHEL系列系统"

            # 下载并执行NodeSource安装脚本
            log_info "添加NodeSource仓库..."
            curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash -

            # 安装Node.js
            log_info "安装Node.js..."
            if command -v dnf &> /dev/null; then
                dnf install -y nodejs
            else
                yum install -y nodejs
            fi
            ;;
        *)
            log_error "不支持的操作系统: $os_type"
            log_error "请手动安装Node.js LTS版本"
            log_info "访问: https://nodejs.org/"
            exit 1
            ;;
    esac

    # 验证安装
    if command -v node &> /dev/null && command -v npm &> /dev/null; then
        log_info "Node.js安装成功"
        echo ""
        log_info "验证安装版本:"
        node --version
        npm --version
    else
        log_error "Node.js安装失败"
        exit 1
    fi
}

# 检查Claude Code是否已安装
check_claude() {
    if command -v claude &> /dev/null; then
        local claude_version=$(claude --version 2>/dev/null || echo "未知版本")
        log_info "Claude Code已安装: $claude_version"
        return 0
    else
        log_warn "Claude Code未安装"
        return 1
    fi
}

# 安装Claude Code
install_claude() {
    log_step "正在安装Claude Code..."

    # 使用npm全局安装
    npm install -g @anthropic-ai/claude-code

    # 验证安装
    if command -v claude &> /dev/null; then
        log_info "Claude Code安装成功"
        echo ""
        log_info "验证安装版本:"
        claude --version
    else
        log_error "Claude Code安装失败"
        exit 1
    fi
}

# 配置环境变量
create_config() {
    log_step "配置Claude Code环境变量..."

    # 获取实际用户的HOME目录（即使使用sudo运行）
    local actual_user=${SUDO_USER:-$USER}
    local user_home=$(eval echo ~$actual_user)
    local bashrc_file="$user_home/.bashrc"

    log_info "配置文件: $bashrc_file"

    # 获取 API Key
    local api_key="$API_KEY"

    # 如果是交互模式且未提供 API Key，则提示输入
    if [[ -z "$api_key" && "$NON_INTERACTIVE" == false ]]; then
        echo ""
        while [[ -z "$api_key" ]]; do
            read -p "请输入Anthropic API Key: " api_key
            if [[ -z "$api_key" ]]; then
                log_warn "API Key不能为空，请重新输入"
            fi
        done
    fi

    # 验证 API Key 是否存在
    if [[ -z "$api_key" ]]; then
        log_error "未提供 API Key"
        exit 1
    fi

    # 使用传入的或默认的 base_url
    local base_url="$BASE_URL"

    # 检查是否已存在环境变量配置
    local has_api_key=$(grep -c "export ANTHROPIC_API_KEY=" "$bashrc_file" 2>/dev/null || echo "0")
    local has_auth_token=$(grep -c "export ANTHROPIC_AUTH_TOKEN=" "$bashrc_file" 2>/dev/null || echo "0")
    local has_base_url=$(grep -c "export ANTHROPIC_BASE_URL=" "$bashrc_file" 2>/dev/null || echo "0")

    # 备份现有配置
    if [[ $has_api_key -gt 0 ]] || [[ $has_auth_token -gt 0 ]] || [[ $has_base_url -gt 0 ]]; then
        log_warn "检测到已存在的环境变量配置"
        cp "$bashrc_file" "$bashrc_file.backup.$(date +%Y%m%d%H%M%S)"
        log_info "已备份配置文件"

        # 删除旧的配置
        sed -i '/export ANTHROPIC_API_KEY=/d' "$bashrc_file"
        sed -i '/export ANTHROPIC_AUTH_TOKEN=/d' "$bashrc_file"
        sed -i '/export ANTHROPIC_BASE_URL=/d' "$bashrc_file"
        log_info "已删除旧的环境变量配置"
    fi

    # 添加环境变量到 .bashrc
    log_info "添加环境变量到 $bashrc_file"
    echo "" >> "$bashrc_file"
    echo "# Claude Code Configuration" >> "$bashrc_file"
    echo "export ANTHROPIC_API_KEY='$api_key'" >> "$bashrc_file"
    echo "export ANTHROPIC_AUTH_TOKEN='$api_key'" >> "$bashrc_file"
    echo "export ANTHROPIC_BASE_URL='$base_url'" >> "$bashrc_file"

    # 设置正确的文件所有者
    chown $actual_user:$actual_user "$bashrc_file"

    log_info "环境变量配置完成"
    log_info "  - API Key: 已设置"
    log_info "  - Base URL: $base_url"
    log_info "  - 配置文件: $bashrc_file"

    # 提示用户加载配置
    if [[ "$NON_INTERACTIVE" == false ]]; then
        echo ""
        log_warn "环境变量已添加到 ~/.bashrc"
        log_warn "请执行以下命令使配置立即生效："
        echo "  source ~/.bashrc"
        echo ""
        log_info "或者重新打开终端，环境变量将自动生效"
    fi
}

# 显示安装摘要
show_summary() {
    echo ""
    echo "========================================="
    log_info "Claude Code安装完成!"
    echo "========================================="
    echo ""
    log_info "安装信息:"

    if command -v node &> /dev/null; then
        echo "  - Node.js: $(node --version)"
    fi

    if command -v npm &> /dev/null; then
        echo "  - npm: $(npm --version)"
    fi

    if command -v claude &> /dev/null; then
        echo "  - Claude Code: $(claude --version 2>/dev/null || echo '已安装')"
    fi

    local actual_user=${SUDO_USER:-$USER}
    local user_home=$(eval echo ~$actual_user)
    echo "  - 环境变量配置: ~/.bashrc"
    echo ""
    log_info "使用方法:"
    echo "  - 使配置生效: source ~/.bashrc"
    echo "  - 启动Claude Code: claude"
    echo "  - 查看帮助: claude --help"
    echo "  - 查看版本: claude --version"
    echo ""
    log_warn "注意事项:"
    echo "  1. 请妥善保管您的API Key"
    echo "  2. 环境变量已添加到: ~/.bashrc"
    echo "  3. 当前终端需要执行 'source ~/.bashrc' 使配置生效"
    echo "  4. 新打开的终端会自动加载环境变量"
    echo "  5. 如需修改API Key，编辑 ~/.bashrc 文件中的 ANTHROPIC_API_KEY"
    echo ""
    log_info "验证环境变量:"
    echo "  echo \$ANTHROPIC_API_KEY"
    echo "  echo \$ANTHROPIC_AUTH_TOKEN"
    echo "  echo \$ANTHROPIC_BASE_URL"
    echo "========================================="
}

# 主函数
main() {
    # 解析命令行参数
    parse_arguments "$@"

    log_info "开始Claude Code自动化安装..."
    if [[ "$NON_INTERACTIVE" == true ]]; then
        log_info "运行模式: 非交互式"
    else
        log_info "运行模式: 交互式"
    fi
    echo ""

    # 检查root权限
    check_root

    echo ""

    # 检查并安装Node.js
    if [[ "$SKIP_NODEJS" == true ]]; then
        log_info "跳过 Node.js 安装（--skip-nodejs）"
    elif ! check_nodejs; then
        echo ""
        if [[ "$AUTO_YES" == true ]]; then
            log_info "自动安装 Node.js（非交互模式）"
            install_nodejs
        else
            read -p "是否安装Node.js LTS版本? (yes/no) [默认: yes]: " install_node
            install_node=${install_node:-yes}

            if [[ "$install_node" == "yes" ]]; then
                echo ""
                install_nodejs
            else
                log_error "Node.js是Claude Code的必需依赖，无法继续安装"
                exit 1
            fi
        fi
    fi

    echo ""

    # 检查并安装Claude Code
    if [[ "$SKIP_CLAUDE" == true ]]; then
        log_info "跳过 Claude Code 安装（--skip-claude）"
    elif ! check_claude; then
        echo ""
        if [[ "$AUTO_YES" == true ]]; then
            log_info "自动安装 Claude Code（非交互模式）"
            install_claude
        else
            read -p "是否安装Claude Code? (yes/no) [默认: yes]: " install_claude_confirm
            install_claude_confirm=${install_claude_confirm:-yes}

            if [[ "$install_claude_confirm" == "yes" ]]; then
                echo ""
                install_claude
            else
                log_info "跳过Claude Code安装"
                exit 0
            fi
        fi
    else
        echo ""
        if [[ "$FORCE_INSTALL" == true ]]; then
            log_info "强制重新安装 Claude Code（--force）"
            npm install -g @anthropic-ai/claude-code --force
        elif [[ "$AUTO_YES" == false ]]; then
            read -p "Claude Code已安装，是否重新安装? (yes/no) [默认: no]: " reinstall_confirm
            reinstall_confirm=${reinstall_confirm:-no}

            if [[ "$reinstall_confirm" == "yes" ]]; then
                echo ""
                log_info "重新安装Claude Code..."
                npm install -g @anthropic-ai/claude-code --force
            fi
        else
            log_info "Claude Code已安装，跳过安装"
        fi
    fi

    echo ""

    # 配置环境变量
    local actual_user=${SUDO_USER:-$USER}
    local user_home=$(eval echo ~$actual_user)
    local bashrc_file="$user_home/.bashrc"

    # 检查是否已存在环境变量配置
    if grep -q "export ANTHROPIC_API_KEY=" "$bashrc_file" 2>/dev/null; then
        log_warn "检测到 ~/.bashrc 中已存在 ANTHROPIC_API_KEY 配置"

        if [[ "$FORCE_INSTALL" == true ]]; then
            log_info "强制重新配置环境变量（--force）"
            echo ""
            create_config
        elif [[ "$AUTO_YES" == false ]]; then
            echo ""
            read -p "是否重新配置环境变量? (yes/no) [默认: no]: " overwrite_config
            overwrite_config=${overwrite_config:-no}

            if [[ "$overwrite_config" == "yes" ]]; then
                echo ""
                create_config
            else
                log_info "保留现有环境变量配置"
            fi
        else
            log_info "环境变量已存在，保留现有配置"
            log_info "使用 --force 参数可强制重新配置"
        fi
    else
        create_config
    fi

    # 显示摘要
    show_summary
}

# 执行主函数
main "$@"
